<?php
 function re_info( $code = 200,$message = "操作成功",$data = null, $type = "info")
{
    $respans = [
        "code"=>$code,
        "message"=>$message,
        "data"=>$data,
        "type"=>$type,
    ];
    return json_encode($respans);
}

function re_success( $message,$data)
{
    $respans = [
        "code"=>200,
        "message"=> $message ? $message : "操作成功",
        "data"=>$data ? $data : null,
        "type"=>'success',
    ];
    return json_encode($respans);
}


function re_warning( $message,$errormsg)
{
    $respans = [
        "code"=>201,
        "message"=>$message ? $message :  "操作失败",
        "data"=>null,
        "error"=>$errormsg,
        "type"=>'warning',
    ];
    return json_encode($respans);
}

function re_danger( $message,$errormsg)
{
    $respans = [
        "code"=>500,
        "message"=>$message ? $message :  "操作失败",
        "data"=> null,
        "error"=>$errormsg,
        "type"=>'danger',
    ];
    return json_encode($respans);
}


function getModelAllList($modelClass, $sortBy = [ 'sort' => 'asc','created_at' => 'desc',], $where = [],$whereIn = [], $inFind = 'id', $select = [])
{
    // 初始化查询构建器
    /** @var Builder $query */
    $query = $modelClass::query();

    // 应用排序规则
    foreach ($sortBy as $field => $direction) {
        $query->orderBy($field, $direction);
    }

    // 应用筛选条件
    foreach ($where as $field => $value) {
        $query->where($field, $value);
    }
//
    if($whereIn && $inFind){
        $query->whereIn($inFind, $whereIn);
    }

    // 选择要返回的字段
    if (!empty($select)) {
        $query->select($select);
    }

    // 执行查询并转换为数组
    $list = $query->get()->toArray();

    // 根据查询结果返回不同的响应
    if (empty($list)) {
        return re_warning('暂无数据', null);
    } else {
        return re_success('操作成功', $list);
    }
}



/**
 * 封装插入数据的方法
 *
 * @param array $data 请求数据
 * @param string $modelClass 模型类名
 * @return array 响应结果
 */
function insertData(string $uniqueField,array $data, string $modelClass)
{
    // 调用模型的 create 方法插入数据
    // 获取要检查唯一性的字段值
    $uniqueValue = $data[$uniqueField] ?? null;

    if ($uniqueValue) {
        // 检查数据库中是否已存在相同名称的项目
        $exists = $modelClass::where($uniqueField, $uniqueValue)->exists();
        if ($exists) {
            // 若存在，返回错误信息
            return re_warning("{$data[$uniqueField]} 已存在", null);
        }
    }
    // 若不存在同名项目，执行插入操作
    $inserted = $modelClass::create($data);

    if ($inserted) {
        // 插入成功
        return re_success("添加成功", $inserted);
    } else {
        // 插入失败
        return re_danger("添加失败", null);
    }
}


/**
 * 封装更新数据的方法
 *
 * @param \Illuminate\Http\Request $request 请求对象
 * @param string $modelClass 模型类名
 * @param string $findField 用于查找记录的字段，默认为 'id'
 * @return array 响应结果
 */
function updateData(string $modelClass, string $findField,array $data)
{
    // 创建模型实例
    $model = new $modelClass();
    // 根据指定字段查找记录并更新
    $info = $model->find($findField)->update($data);
    if ($info) {
        // 更新成功
        return re_success("修改成功", null);
    } else {
        // 更新失败
        return re_danger("修改失败", null);
    }
}

/**
 * 封装删除记录的方法
 *
 * @param \Illuminate\Http\Request $request 请求对象
 * @param string $modelClass 模型类名
 * @param string $field 用于标识要删除记录的字段名，默认为 'id'
 * @return array 响应结果
 */
function deleteData(\Illuminate\Http\Request $request, string $modelClass, string $field = 'id')
{
    // 从请求中获取要删除记录的标识值
    $id = $request->input($field);
    // 调用模型的 destroy 方法删除记录
    $info = $modelClass::destroy($id);
    if ($info) {
        // 删除成功
        return re_success("删除成功", null);
    } else {
        // 删除失败
        return re_danger("删除失败", null);
    }
}

/**
 * 封装查找记录并返回响应的方法
 *
 * @param \Illuminate\Http\Request $request 请求对象
 * @param string $modelClass 模型类名
 * @param string $field 用于查找记录的字段名，默认为 'id'
 * @return array 响应结果
 */
function infoData(\Illuminate\Http\Request $request, string $modelClass, string $field = 'id')
{
    // 从请求中获取查找记录所需的值
    $value = $request->{$field};
    // 根据值查找记录
    $info = $modelClass::find($value);
    if ($info) {
        // 若找到记录，返回成功响应
        return re_success("添加成功", $info);
    } else {
        // 若未找到记录，返回警告响应
        return re_warning("没有该数据", null);
    }
}


/**
 * 封装修改模型状态的方法
 *
 * @param \Illuminate\Http\Request $request 请求对象
 * @param string $modelClass 模型类名
 * @param string $statusField 状态字段名，默认为 'status'
 * @param string $idField 用于查找记录的 ID 字段名，默认为 'id'
 * @return array 响应结果
 */
function toggleModelStatus(\Illuminate\Http\Request $request, string $modelClass, string $statusField = 'status', string $idField = 'id')
{
    // 获取请求中的所有数据
    $data = $request->all();
    // 根据 ID 查找对应的模型记录
    $model = $modelClass::find($data[$idField]);
    if ($model) {
        // 切换状态
        $model->{$statusField} = $model->{$statusField} === 1 ? 2 : 1;
        // 保存修改
        $info = $model->save();
        if ($info) {
            // 修改成功
            return re_success("修改成功", null);
        }
    }
    // 修改失败
    return re_danger("修改失败", null);
}
